'''
大多数LLM应用程序不会直接将用户输入传递到LLM中。
通常，它们会将用户输入添加到一个更大的文本片段中，称为提示模板，
该模板提供了有关特定任务的附加上下文。

PromptTemplate 将用户输入转化为完全格式化的提示
'''
from langchain.prompts import PromptTemplate

prompt = PromptTemplate.from_template("What is a good name for a company that makes {product}?")
print(prompt.format(product="colorful socks"))

'''
PromptTemplates还可以用于生成消息列表
提示不仅包含有关内容的信息，还包含每个消息（其角色、其在列表中的位置等） 
在这里，最常见的是ChatPromptTemplate是ChatMessageTemplate的列表。
每个ChatMessageTemplate包含了格式化该ChatMessage的指令 - 其角色，以及其内容
'''
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

template = "You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

print(chat_prompt.format_messages(input_language="English", output_language="French", text="I love programming."))

'''
输出解释器
OutputParsers将LLM的原始输出转换为可以在下游使用的格式。
例如：
    1.将LLM的文本转换为结构化信息（如JSON）
    2.将ChatMessage转换为字符串
    3.将除消息之外的其他信息转化为字符串
'''
from langchain.schema import BaseOutputParser

class CommaSeparatedListOutputParser(BaseOutputParser):
    """Parse the output of an LLM call to a comma-separated list."""

    def parse(self, text: str):
        """Parse the output of an LLM call."""
        return text.strip().split(", ")

print(CommaSeparatedListOutputParser().parse("hi, bye"))
# >> ['hi', 'bye']